#include <stdio.h>
#include <modbus.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>

#define SERVER_IP "192.168.1.219"  // 从站的 IP 地址
#define SERVER_PORT 502           // 默认 Modbus TCP 端口号

int main() {
    modbus_t *mb;
    uint16_t tab_reg[10];  // 存储寄存器数据

    // 创建 Modbus TCP 连接
    mb = modbus_new_tcp(SERVER_IP, SERVER_PORT);
    if (mb == NULL) {
        fprintf(stderr, "Unable to create the libmodbus context\n");
        return -1;
    }

    // 连接到从站
    if (modbus_connect(mb) == -1) {
        fprintf(stderr, "Unable to connect to server\n");
        modbus_free(mb);
        return -1;
    }

    // 读取前两个寄存器（假设起始地址为 0）
    int rc = modbus_read_registers(mb, 0, 2, tab_reg);
    if (rc == -1) {
        fprintf(stderr, "Modbus read failed\n");
        modbus_free(mb);
        return -1;
    }

    // 打印读取到的寄存器数据
    printf("Read Registers:\n");
    for (int i = 0; i < 2; i++) {
        printf("Reg[%d] = %d\n", i, tab_reg[i]);
    }

    // 填写修改前四个寄存器的值（假设起始地址为 0）
    for (int i = 0; i < 4; i++) {
        tab_reg[i] = 100 + i;  // 设定为自定义值（例如 100, 101, 102, 103）
    }

    rc = modbus_write_registers(mb, 0, 4, tab_reg);
    if (rc == -1) {
        fprintf(stderr, "Modbus write failed\n");
        modbus_free(mb);
        return -1;
    }

    printf("Written Registers:\n");
    for (int i = 0; i < 4; i++) {
        printf("Reg[%d] = %d\n", i, tab_reg[i]);
    }

    // 断开连接并清理资源
    modbus_close(mb);
    modbus_free(mb);

    return 0;
}
